package com.louzhu.gulimall.product.exception;

import com.louzhu.common.exception.BizCodeEnum;
import com.louzhu.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

/*
  统一异常处理器
 */
// 日志记录注解
@Slf4j
//@ResponseBody 以JSON格式返回数据
//@ControllerAdvice(basePackages = "com.louzhu.gulimall.product.app")
// 等同于 @ResponseBody + @ControllerAdvice
@RestControllerAdvice(basePackages = "com.louzhu.gulimall.product.app")
public class GulimallExceptionControllerAdvice {

    // 告诉SpringMVC 这个异常集中处理器能处理什么异常
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleValidException(MethodArgumentNotValidException e){
        log.error("数据校验出错：{}，异常类型：{}",e.getMessage(),e.getClass());
        // 使用Map封装异常信息
        Map<String,String> map = new HashMap<>();
        e.getBindingResult().getFieldErrors().forEach((item)->{
            map.put(item.getField(),item.getDefaultMessage());
        });
        return R.error(BizCodeEnum.VAILD_EXCEPTION.getCode(),BizCodeEnum.VAILD_EXCEPTION.getMessage()).put("data",map);
    }

    // 能够处理所有异常，当其他异常处理器没有处理，才会轮到这个异常处理器
    @ExceptionHandler(value = Throwable.class)
    public R handleValidException(Throwable t){

        // 日志输出错误详情
        log.error("错误：",t);
        return R.error(BizCodeEnum.UNKNOW_EXCEPTION.getCode(),BizCodeEnum.UNKNOW_EXCEPTION.getMessage());
    }
}
